<?php

namespace app\api\controller;

use app\common\controller\BaseController;
use think\Controller;
use app\api\model\User;
use think\Facade\Config;
use util\Jwt;
use util\HttpRequest;

// 处理跨域请求的问题
header("Access-Control-Allow-Origin: *");

/**
 * API 接口基类
 * @author 牧羊人
 * @date 2019/8/29
 * Class APIBase
 * @package app\api\controller
 */
class APIBase extends BaseController
{
    // 模型
    protected $model;
    // 服务
    protected $service;
    // 验证
    protected $validate;
    // 网络请求
    protected $req;
    // 请求序列号(系统生成)
    protected $req_id;
    // 鉴权Token
    protected $token;
    // 人员ID
    protected $userId;
    // 人员信息
    protected $userInfo;

    /**
     * 初始化方法
     * @author 牧羊人
     * @date 2019/8/28
     */
    public function initialize()
    {
        parent::initialize(); // TODO: Change the autogenerated stub

        // 初始化请求信息
        $this->initRequestInfo();

        // 初始化网络请求配置
        $this->initRequestConfig();
    }

    /**
     * 初始化请求信息
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     * @author 牧羊人
     * @date 2019/8/28
     */
    private function initRequestInfo()
    {
        // 请求序列编码
        $requestId = substr(md5(time() . get_random_code(10) . rand(1, 1000)), 8, 16);
        $this->req_id = $requestId;

        file_put_contents(RUNTIME_PATH . "3.txt", json_encode($_REQUEST));

        // 适配网络请求
        $this->req = HttpRequest::getRequestInfo();
        unset($this->req['APIDATA']);
        file_put_contents(RUNTIME_PATH . "1.txt", json_encode($this->req));

        // 临时调试使用
        $is_decrypt = getter($_REQUEST, 'decrypt');
        if (!empty($is_decrypt)) {
            $this->req['decrypt'] = $is_decrypt;
        }

        // 用户ID
        $userId = getter($this->req, 'user_id', 0);
        // Token令牌(校验)
        $token = getter($this->req, 'token', '');
        if ($token) {
            // JWT解密token
            $jwt = new Jwt();
            $uid = $jwt->verifyToken($token);
            file_put_contents(RUNTIME_PATH . "2.txt", 'uid:' . $uid . ",token:" . $token);
            if (!$uid) {
                $this->jsonReturn(MESSAGE_TOKEN_FAILED, false, '', -2);
            }
            if (!$uid || $uid != $userId) {
                $this->jsonReturn(MESSAGE_TOKEN_FAILED, false, '', -2);
            }

            // 根据令牌获取数据信息
            $userModel = new User();
            $userInfo = $userModel->getInfo($userId);
            if (!$userInfo) {
                $this->jsonReturn(MESSAGE_USER_NO_INFO);
            }

            // 验证用户状态
            if ($userInfo['status'] != 1) {
                $this->jsonReturn(MESSAGE_USER_FIRBIDDEN);
            }

            // 设置用户信息
            $this->userId = $userId;
            $this->userInfo = $userInfo;
        }
    }

    /**
     * 登录验证(接口需要登录时调用此方法)
     * @author 牧羊人
     * @date 2019/5/24
     */
    protected function needLogin()
    {
        if (!$this->userId) {
            $this->jsonReturn(message(MESSAGE_NEEDLOGIN));
        }
    }

    /**
     * 初始化分页设置
     * @param int $page 页码
     * @param int $perpage 每页数
     * @param string $limit 限制条数
     * @author 牧羊人
     * @date 2019/5/24
     */
    public function initPage(&$page, &$perpage, &$limit)
    {
        $page = (int)$this->req['page'];
        $perpage = (int)$this->req['perpage'];
        $page = $page ? $page : 1;
        $perpage = $perpage ? $perpage : 10;
        $startIndex = ($page - 1) * $perpage;
        $limit = "{$startIndex}, {$perpage}";
    }

    /**
     * JSON返回结果
     * @author 牧羊人
     * @date 2019/8/28
     */
    public function jsonReturn()
    {
        false && message();

        // 获取参数
        $arr = func_get_args();

        if (!is_array($arr[0])) {
            // 回调函数
            $result = call_user_func_array("message", $arr);
        } else {
            // 函数模式
            $result = $arr[0];
        }
        // 格式化数组
        $result = $this->getStringArray($result);

        // 返回结果
        $output = json_encode($result);
        // DES加密处理
        $output = encrypt($output);
        // DES解密
        if (getter($this->req, 'decrypt')) {
            $output = decrypt($output);
        }
        echo $output;
        exit();
    }

    /**
     * 格式化字符串
     * @param $array
     * @return mixed
     * @author 牧羊人
     * @date 2019/11/5
     */
    private function getStringArray($array)
    {
        foreach ($array as $key => $row) {
            if (is_array($row)) {
                $array[$key] = $this->getStringArray($row);
            } elseif (is_object($row)) {
                //TODO...
            } else {
                $array[$key] = (string)$row;
            }
        }
        return $array;
    }
}
